// SuperListActivity.java
package com.xxxy.ljh.myapplication.activity;

import android.annotation.SuppressLint;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.xxxy.ljh.myapplication.R;
import com.xxxy.ljh.myapplication.DaoImpl.UserDaoImpl;
import com.xxxy.ljh.myapplication.model.User;

import java.util.List;

/**
 * 超级管理员用户管理界面
 *
 * 此Activity用于展示系统中所有用户的信息，并提供编辑功能。
 * 支持不同权限等级的用户进行操作，其中权限为3的超级管理员拥有最高权限，
 * 权限为2的管理员仅能修改部分低权限用户信息。
 */
public class SuperListActivity extends AppCompatActivity {

    private ListView listView;
    private UserAdapter adapter;
    private List<User> userList;
    private UserDaoImpl userDao;
    private int currentUserId; // 当前登录用户的ID
    private int currentUserRole; // 当前登录用户的权限

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_super_list);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        // 获取当前登录用户信息
        getCurrentUserInfo();

        initViews();
        loadUserData();
    }

    /**
     * 获取当前登录用户的基本信息（ID和权限）
     *
     * 从SharedPreferences中读取当前登录用户名，然后通过UserDao查询数据库获取详细信息。
     */
    private void getCurrentUserInfo() {
        SharedPreferences prefs = getSharedPreferences("user_prefs", MODE_PRIVATE);
        String currentUsername = prefs.getString("username", "");

        if (!currentUsername.isEmpty()) {
            UserDaoImpl userDao = new UserDaoImpl(this);
            User currentUser = userDao.getUserByUsername(currentUsername);
            if (currentUser != null) {
                currentUserId = currentUser.getUserId();
                currentUserRole = currentUser.getRole();
            }
        }
    }

    /**
     * 初始化视图组件并绑定监听事件
     *
     * 主要初始化ListView控件，并为其设置点击监听器以弹出编辑对话框。
     */
    private void initViews() {
        listView = findViewById(R.id.listView);
        userDao = new UserDaoImpl(this);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                User selectedUser = userList.get(position);
                showEditUserDialog(selectedUser, position);
            }
        });
    }

    /**
     * 显示编辑用户的对话框
     *
     * 弹出自定义布局的AlertDialog，显示选中用户的所有字段供编辑。
     * 根据当前用户权限动态控制角色Spinner是否可用。
     *
     * @param user 需要被编辑的用户对象
     * @param position 用户在列表中的位置索引
     */
    private void showEditUserDialog(User user, int position) {
        // 创建一个自定义布局的对话框
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        View dialogView = getLayoutInflater().inflate(R.layout.dialog_edit_user, null);
        builder.setView(dialogView);

        // 获取对话框中的输入框
        EditText etUsername = dialogView.findViewById(R.id.et_username);
        EditText etRealName = dialogView.findViewById(R.id.et_real_name);
        EditText etStudentId = dialogView.findViewById(R.id.et_student_id);
        EditText etPhone = dialogView.findViewById(R.id.et_phone);
        EditText etEmail = dialogView.findViewById(R.id.et_email);
        EditText etDepartment = dialogView.findViewById(R.id.et_department);
        Spinner spinnerRole = dialogView.findViewById(R.id.spinner_role);

        // 设置初始值
        etUsername.setText(user.getUsername());
        etRealName.setText(user.getRealName());
        etStudentId.setText(user.getStudentId());
        etPhone.setText(user.getPhone());
        etEmail.setText(user.getEmail());
        etDepartment.setText(user.getDepartment());

        // 设置角色选择器的初始值
        spinnerRole.setSelection(user.getRole());

        // 根据当前用户权限控制角色选择器的可编辑性
        if (currentUserRole == 3) {
            // 权限为3时可以修改所有权限
            spinnerRole.setEnabled(true);
        } else if (currentUserRole == 2) {
            // 权限为2时只能修改权限为0和1的用户
            if (user.getRole() == 0 || user.getRole() == 1) {
                spinnerRole.setEnabled(true);
            } else {
                spinnerRole.setEnabled(false);
                Toast.makeText(SuperListActivity.this, "您只能修改权限为0或1的用户", Toast.LENGTH_SHORT).show();
            }
        } else {
            // 其他权限不能修改角色
            spinnerRole.setEnabled(false);
        }

        // 创建对话框
        AlertDialog dialog = builder.create();

        // 设置按钮点击事件
        dialogView.findViewById(R.id.btn_save).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 检查权限是否允许修改该用户的角色
                int newRole = spinnerRole.getSelectedItemPosition();
                boolean hasPermission = checkPermissionToUpdateRole(user.getRole(), newRole);

                if (!hasPermission) {
                    Toast.makeText(SuperListActivity.this, "您没有权限修改此用户的角色", Toast.LENGTH_SHORT).show();
                    return;
                }

                // 更新用户信息
                user.setUsername(etUsername.getText().toString());
                user.setRealName(etRealName.getText().toString());
                user.setStudentId(etStudentId.getText().toString());
                user.setPhone(etPhone.getText().toString());
                user.setEmail(etEmail.getText().toString());
                user.setDepartment(etDepartment.getText().toString());

                // 只有有权限时才更新角色
                if (spinnerRole.isEnabled()) {
                    user.setRole(newRole);
                }

                // 调用更新方法
                if (userDao.updateUser(user)) {
                    // 更新成功后刷新列表
                    userList.set(position, user);
                    adapter.notifyDataSetChanged();
                    Toast.makeText(SuperListActivity.this, "用户信息更新成功", Toast.LENGTH_SHORT).show();
                    dialog.dismiss();
                } else {
                    Toast.makeText(SuperListActivity.this, "更新失败", Toast.LENGTH_SHORT).show();
                }
            }
        });

        dialogView.findViewById(R.id.btn_cancel).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });

        dialog.show();
    }

    /**
     * 检查当前用户是否有权限更新目标用户的角色
     * @param originalRole 目标用户的原始角色
     * @param newRole 要设置的新角色
     * @return 是否有权限
     */
    private boolean checkPermissionToUpdateRole(int originalRole, int newRole) {
        if (currentUserRole == 3) {
            // 权限为3时可以修改所有权限
            return true;
        } else if (currentUserRole == 2) {
            // 权限为2时只能修改权限为0和1的用户，且不能将其改为2或3
            if ((originalRole == 0 || originalRole == 1) && (newRole == 0 || newRole == 1)) {
                return true;
            }
        } else {
            // 其他权限不允许修改角色
            return false;
        }
        return false;
    }

    /**
     * 加载所有用户数据到列表中
     *
     * 使用UserDao获取全部用户数据，并将结果绑定至ListView适配器。
     */
    private void loadUserData() {
        userList = userDao.getAllUsers();
        adapter = new UserAdapter();
        listView.setAdapter(adapter);
    }

    /**
     * 自定义用户列表适配器
     *
     * 实现BaseAdapter接口，负责渲染每个用户项的UI内容。
     */
    private class UserAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            return userList.size();
        }

        @Override
        public Object getItem(int position) {
            return userList.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = getLayoutInflater().inflate(R.layout.item_user, null);
                holder = new ViewHolder();
                holder.tvUsername = convertView.findViewById(R.id.tv_username);
                holder.tvRealName = convertView.findViewById(R.id.tv_real_name);
                holder.tvStudentId = convertView.findViewById(R.id.tv_student_id);
                holder.tvPhone = convertView.findViewById(R.id.tv_phone);
                holder.tvEmail = convertView.findViewById(R.id.tv_email);
                holder.tvDepartment = convertView.findViewById(R.id.tv_department);
                holder.tvRole = convertView.findViewById(R.id.tv_role);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            User user = userList.get(position);
            holder.tvUsername.setText("用户名: " + user.getUsername());
            holder.tvRealName.setText("姓名: " + user.getRealName());
            holder.tvStudentId.setText("学号: " + user.getStudentId());
            holder.tvPhone.setText("电话: " + user.getPhone());
            holder.tvEmail.setText("邮箱: " + user.getEmail());
            holder.tvDepartment.setText("部门: " + user.getDepartment());
            holder.tvRole.setText("权限: " + user.getRole());

            return convertView;
        }

        /**
         * 视图持有者类，用于优化ListView性能
         *
         * 缓存item_user.xml中的各个TextView控件引用，避免重复findViewById调用。
         */
        class ViewHolder {
            TextView tvUsername;
            TextView tvRealName;
            TextView tvStudentId;
            TextView tvPhone;
            TextView tvEmail;
            TextView tvDepartment;
            TextView tvRole;
        }
    }
}
